﻿using System;


namespace BridgePatterns
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建手机品牌A，并安装游戏软件
            Phone phoneA = new PhoneBrandA(new GameApp());
            phoneA.RunApp();

            // 创建手机品牌B，并安装社交软件
            Phone phoneB = new PhoneBrandB(new SocialApp());
            phoneB.RunApp();

            // 创建手机品牌C，并安装音乐软件
            Phone phoneC = new PhoneBrandC(new MusicApp());
            phoneC.RunApp();


            // 创建手机品牌D，并安装社交软件
            Phone phoneD = new PhoneBrandD(new SocialApp());
            phoneD.RunApp();

            // 创建手机品牌D，并安装社交软件
            Phone phoneD2 = new PhoneBrandD(new GameApp());
            phoneD2.RunApp();



            Console.ReadLine();
        }
    }
    interface Ichan1
    {
        void func11();
    }


    interface Ichan2
    {
        void func2();
    }



    // 实现部分接口 - 手机软件
    interface IApp: Ichan1, Ichan2
    {
       
        void Run();
    }

    // 具体实现类 - 游戏软件
    class GameApp : IApp
    {
        public void Run()
        {
            Console.WriteLine("运行游戏软件");
        }


        public void func11()
        {

        }

        public void func2()
        {

        }
    }

    // 具体实现类 - 社交软件
    class SocialApp : IApp
    {
        public void Run()
        {
            Console.WriteLine("运行社交软件");
        }

        public void func11()
        {

        }

        public void func2()
        {

        }
    }

    // 具体实现类 - 音乐软件
    class MusicApp : IApp
    {
        public void Run()
        {
            Console.WriteLine("运行音乐软件");
        }
        public void func11()
        {

        }

        public void func2()
        {

        }
    }

    // 具体实现类 - 地图软件
    class MapApp : IApp
    {
        public void Run()
        {
            Console.WriteLine("运行地图软件");
        }
        public void func11()
        {

        }

        public void func2()
        {

        }
    }

    // 抽象部分 - 手机,抽象类
    abstract class Phone
    {
        
        protected IApp app;     //定义一个app字段,绑定到手机上

        string zhangsan;        //抽象类可以包含字段

        public Phone(IApp app)
        {
            this.app = app;
        }

        public virtual void func1()
        {

        }
        
        public abstract void RunApp();
    }

    // 具体实现类 - 手机品牌A
    class PhoneBrandA : Phone
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="app"></param>
        public PhoneBrandA(IApp app) : base(app)
        {
        }

        public override void RunApp()
        {
            Console.Write("手机品牌A - ");
            app.Run();
        }

        public override void func1()
        {

        }


    }

    // 具体实现类 - 手机品牌B
    class PhoneBrandB : Phone
    {
        public PhoneBrandB(IApp app) : base(app)
        {
        }

        public override void RunApp()
        {
            Console.Write("手机品牌B - ");
            app.Run();
        }
    }

    // 具体实现类 - 手机品牌C
    class PhoneBrandC : Phone
    {
        public PhoneBrandC(IApp app) : base(app)
        {
        }

        public override void RunApp()
        {
            Console.Write("手机品牌C - ");
            app.Run();
        }
    }
    // 具体实现类 - 手机品牌D
    class PhoneBrandD : Phone
    {
        public PhoneBrandD(IApp app):base(app)
        {
        }

        public override void RunApp()
        {
            Console.Write("手机品牌D - ");
            app.Run();
        }
    }



}
